--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
scripts/ci/tree_manifest_generate.py e41daa5b65e07a5baa1aaad32d97f90482f1cd1c (e41daa5b) Text, 3.89 KB
T8b949e#!/usr/bin/env python3
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Fast git-index tree manifest for meshchatx.rsm signing.
Hashes index blobs (same bytes as git show :path) via git cat-file --batch.
Output format matches scripts/ci/tree-manifest.sh generate.
"""
Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations
Tff7b72import T7ee787hashlib
Tff7b72import T7ee787os
Tff7b72import T7ee787subprocess
Tff7b72import T7ee787sys
Tff7b72from T7ee787pathlib Tff7b72import Te6edf3Path
Te6edf3MANIFEST_HEADER Tff7b72= Ta5d6ff"Ta5d6ff# meshchatx tree manifest v1Ta5d6ff"
Te6edf3EXCLUDE_RSM Tff7b72= Ta5d6ff"Ta5d6ffmeshchatx.rsmTa5d6ff"
Te6edf3ALLOWED_MODES Tff7b72= Tffa657frozensetTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ff100644Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff100755Ta5d6ff"Tb4b4b4}Tb4b4b4)
Tff7b72def Td2a8ff_repo_rootTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3PathTb4b4b4:
Tff7b72return Te6edf3PathTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffparentsTb4b4b4[T79c0ff2Tb4b4b4]
Tff7b72def Td2a8ffis_excluded_pathTb4b4b4(Te6edf3pathTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72if Te6edf3path Tff7b72== Te6edf3EXCLUDE_RSMTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72if Te6edf3path Tff7b72== Ta5d6ff"Ta5d6ffvendorTa5d6ff" Tff7b72or Te6edf3pathTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffvendor/Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72if Ta5d6ff"Ta5d6ff/vendor/Ta5d6ff" Tff7b72in Te6edf3path Tff7b72or Te6edf3pathTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ff/vendorTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72return Tff7b72False
Tff7b72def Td2a8ff_parse_ls_files_zTb4b4b4(Te6edf3rawTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657tupleTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4]Tb4b4b4:
Te6edf3entriesTb4b4b4: Tffa657listTb4b4b4[Tffa657tupleTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3chunk Tff7b72in Te6edf3rawTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ffbTa5d6ff"Tffea00\0Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3chunkTb4b4b4:
Tff7b72continue
Te6edf3tab Tff7b72= Te6edf3chunkTff7b72.Td2a8fffindTb4b4b4(Ta5d6ffbTa5d6ff"Tffea00\tTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3tab Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72continue
Te6edf3meta Tff7b72= Te6edf3chunkTb4b4b4[Tb4b4b4:Te6edf3tabTb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffasciiTa5d6ff"Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff"Ta5d6ffreplaceTa5d6ff"Tb4b4b4)
Te6edf3path Tff7b72= Te6edf3chunkTb4b4b4[Te6edf3tab Tff7b72+ T79c0ff1 Tb4b4b4:Tb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff"Ta5d6ffsurrogateescapeTa5d6ff"Tb4b4b4)
Te6edf3parts Tff7b72= Te6edf3metaTff7b72.Td2a8ffsplitTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3partsTb4b4b4) Tff7b72< T79c0ff3Tb4b4b4:
Tff7b72continue
Te6edf3modeTb4b4b4, Te6edf3oidTb4b4b4, Te6edf3_stage Tff7b72= Te6edf3partsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3partsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3partsTb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3entriesTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3pathTb4b4b4, Te6edf3modeTb4b4b4, Te6edf3oidTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3entries
Tff7b72def Td2a8ff_read_batch_blobTb4b4b4(Te6edf3stdoutTb4b4b4, Te6edf3headerTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Tffa657bytes Tff7b72| Tff7b72NoneTb4b4b4:
Te6edf3parts Tff7b72= Te6edf3headerTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3partsTb4b4b4) Tff7b72== T79c0ff2 Tff7b72and Te6edf3partsTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffmissingTa5d6ff"Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72if Tffa657lenTb4b4b4(Te6edf3partsTb4b4b4) Tff7b72!= T79c0ff3Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffunexpected cat-file header: Tffd700{Te6edf3headerTffd700!r}Ta5d6ff"Tb4b4b4)
Te6edf3_oidTb4b4b4, Te6edf3typTb4b4b4, Te6edf3size_s Tff7b72= Te6edf3parts
Tff7b72if Te6edf3typ Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffmissingTa5d6ff"Tb4b4b4:
Tff7b72return Tff7b72None
Te6edf3size Tff7b72= Tffa657intTb4b4b4(Te6edf3size_sTb4b4b4)
Te6edf3data Tff7b72= Te6edf3stdoutTff7b72.Td2a8ffreadTb4b4b4(Te6edf3sizeTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72!= Te6edf3sizeTb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffshort read from git cat-file --batchTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3typ Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffblobTa5d6ff"Tb4b4b4:
Te6edf3delim Tff7b72= Te6edf3stdoutTff7b72.Td2a8ffreadTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72if Te6edf3delim Tff7b72!= Ta5d6ffbTa5d6ff"Tffea00\nTa5d6ff"Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffexpected newline delimiter after cat-file blobTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3data
Tff7b72def Td2a8ffgenerate_manifestTb4b4b4(Te6edf3rootTb4b4b4: Te6edf3PathTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Te6edf3env Tff7b72= Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)
Te6edf3envTb4b4b4[Ta5d6ff"Ta5d6ffLC_ALLTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffCTa5d6ff"
Te6edf3raw Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffcheck_outputTb4b4b4(
Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffls-filesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-sTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-zTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3rootTb4b4b4,
Te6edf3envTff7b72=Te6edf3envTb4b4b4,
Tb4b4b4)
Te6edf3rowsTb4b4b4: Tffa657listTb4b4b4[Tffa657tupleTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3pathTb4b4b4, Te6edf3modeTb4b4b4, Te6edf3oid Tff7b72in Te6edf3_parse_ls_files_zTb4b4b4(Te6edf3rawTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3path Tff7b72or Te6edf3is_excluded_pathTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Tff7b72continue
Tff7b72if Te6edf3mode Tff7b72not Tff7b72in Te6edf3ALLOWED_MODESTb4b4b4:
Tff7b72continue
Te6edf3rowsTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3pathTb4b4b4, Te6edf3modeTb4b4b4, Te6edf3oidTb4b4b4)Tb4b4b4)
Te6edf3rowsTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3itemTb4b4b4: Te6edf3itemTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Te6edf3lines Tff7b72= Tb4b4b4[Te6edf3MANIFEST_HEADERTb4b4b4]
Tff7b72if Tff7b72not Te6edf3rowsTb4b4b4:
Tff7b72return Ta5d6ff"Tffea00\nTa5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3linesTb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"
Te6edf3proc Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffPopenTb4b4b4(
Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcat-fileTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--batchTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3rootTb4b4b4,
Te6edf3stdinTff7b72=Te6edf3subprocessTff7b72.Td2a8ffPIPETb4b4b4,
Te6edf3stdoutTff7b72=Te6edf3subprocessTff7b72.Td2a8ffPIPETb4b4b4,
Te6edf3envTff7b72=Te6edf3envTb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3procTff7b72.Td2a8ffstdin Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Te6edf3procTff7b72.Td2a8ffstdout Tff7b72is Tff7b72not Tff7b72None
Te6edf3stdin_buf Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3oidTffd700}Tffea00\nTa5d6ff" Tff7b72for Te6edf3_pathTb4b4b4, Te6edf3_modeTb4b4b4, Te6edf3oid Tff7b72in Te6edf3rowsTb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffasciiTa5d6ff"Tb4b4b4)
Te6edf3procTff7b72.Td2a8ffstdinTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3stdin_bufTb4b4b4)
Te6edf3procTff7b72.Td2a8ffstdinTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3pathTb4b4b4, Te6edf3_modeTb4b4b4, Te6edf3_oid Tff7b72in Te6edf3rowsTb4b4b4:
Te6edf3header Tff7b72= Te6edf3procTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffreadlineTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3headerTb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffgit cat-file --batch closed stdout earlyTa5d6ff"Tb4b4b4)
Te6edf3blob Tff7b72= Te6edf3_read_batch_blobTb4b4b4(Te6edf3procTff7b72.Td2a8ffstdoutTb4b4b4, Te6edf3headerTb4b4b4)
Tff7b72if Te6edf3blob Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72continue
Te6edf3digest Tff7b72= Te6edf3hashlibTff7b72.Td2a8ffsha256Tb4b4b4(Te6edf3blobTb4b4b4)Tff7b72.Td2a8ffhexdigestTb4b4b4(Tb4b4b4)
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3digestTffd700}Ta5d6ff Tffd700{Te6edf3pathTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3procTff7b72.Td2a8ffwaitTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3procTff7b72.Td2a8ffreturncode Tff7b72not Tff7b72in Tb4b4b4(T79c0ff0Tb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffgit cat-file --batch exited Tffd700{Te6edf3procTff7b72.Td2a8ffreturncodeTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72return Ta5d6ff"Tffea00\nTa5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3linesTb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"
Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Te6edf3root Tff7b72= Te6edf3_repo_rootTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3generate_manifestTb4b4b4(Te6edf3rootTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6fftree_manifest_generate.py: Tffd700{Te6edf3excTffd700}Ta5d6ff"Tb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Tff7b72return T79c0ff1
Tff7b72return T79c0ff0
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Tff7b72raise Tf85149SystemExitTb4b4b4(Te6edf3mainTb4b4b4(Tb4b4b4)Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────